#include<bits/stdc++.h>
#define ll long long
#define pb emplace_back
using namespace std;
const ll N=1.5e5+5;
ll n,m,a,b;
vector<int> e[N];
ll fa[N],dep[N];bool vis[N*3];
void bfs(){
	queue<int> q;q.push(1);vis[1]=1;
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i:e[x]){
			if(vis[i]) continue;
			vis[i]=1,fa[i]=x,dep[i]=dep[x]+1;
			q.push(i);
		}
	}
}
vector<pair<ll,ll>> ev,ee[N*3];
void add(int x,int y,ll w){ee[x].pb(y,w);}
int tot;
ll ans[N*3];
ll dis[N*3];
unordered_set<int> up[N],dn[N];
bool ou[N],od[N];
#define pii pair<ll,ll>
void dij(){
	memset(dis,0x1f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	tot++;for(int i=1;i<=n;i++) add(tot,i,ans[i]);
	dis[tot]=0;
	priority_queue<pii,vector<pii>,greater<pii>> q;
	q.push({0,tot});
	while(!q.empty()){
		auto p=q.top();q.pop();
		// cerr<<p.second<<endl;
		if(vis[p.second]) continue;
		vis[p.second]=1;
		for(auto x:ee[p.second]){
			if(vis[x.first]) continue;
			if(dis[x.first]>dis[p.second]+x.second){
				dis[x.first]=dis[p.second]+x.second;
				q.push(pii{dis[x.first],x.first});
			}
		}
	}
}
set<pair<int,int>> st;
int main(){
	freopen("edge.in","r",stdin);
	freopen("edge.out","w",stdout);
	cin.tie(nullptr)->sync_with_stdio(false);
	ll i,x,y;cin>>n>>m>>a>>b;tot=n;
	for(i=1;i<=m;i++) cin>>x>>y,e[x].pb(y),e[y].pb(x),ev.pb(x,y),st.insert({x,y}),st.insert({y,x});
	bfs();
	for(i=2;i<=n;i++) ans[i]=min(dep[i]*a,dep[i]/2*b+dep[i]%2*a);
	if(a<=b){
		for(i=2;i<=n;i++) cout<<ans[i]<<'\n';
		return 0;
	}
	for(auto p:ev){
		x=p.first,y=p.second;
		if(dep[x]>dep[y]) swap(x,y);
		if(dep[x]<dep[y]) dn[x].insert(y),up[y].insert(x);
	}
	// cerr<<1<<endl;
	for(auto p:ev){
		x=p.first,y=p.second;
		if(dep[x]==dep[y]){
			if(dep[x]%2==1){
				if(up[x].size()>up[y].size()) swap(x,y);
				if(up[x].size()<up[y].size()) ans[x]=min(ans[x],ans[fa[x]]+b);
				bool oy=0;
				for(int i:up[x]){
					if(!up[y].count(i)){oy=1;break;}
				}
				if(oy)	ans[x]=min(ans[x],ans[fa[x]]+b),
						ans[y]=min(ans[y],ans[fa[y]]+b);
				
				if(dn[x].size()>dn[y].size()) swap(x,y);
				if(dn[x].size()<dn[y].size()) ans[x]=min(ans[x],ans[fa[x]]+b+b);
				oy=0;
				for(int i:dn[x]){
					if(!dn[y].count(i)){oy=1;break;}
				}
				if(oy)	ans[x]=min(ans[x],ans[fa[x]]+b+b),
						ans[y]=min(ans[y],ans[fa[y]]+b+b);
			}
			else{
				vector<int> rem;
				for(int i:up[x]) if(!up[y].count(i)) rem.pb(i);
				for(int i:rem) ans[i]=min(ans[i],b*(dep[i]/2+2)),up[x].erase(i);
				rem.clear();
				for(int i:up[y]) if(!up[x].count(i)) rem.pb(i);
				for(int i:rem) ans[i]=min(ans[i],b*(dep[i]/2+2)),up[y].erase(i);
				rem.clear();
				
				for(int i:dn[x]) if(!dn[y].count(i)) rem.pb(i);
				for(int i:rem) ans[i]=min(ans[i],b*(dep[i]/2+1)),dn[x].erase(i);
				rem.clear();
				for(int i:dn[y]) if(!dn[x].count(i)) rem.pb(i);
				for(int i:rem) ans[i]=min(ans[i],b*(dep[i]/2+1)),dn[y].erase(i);
				rem.clear();
			}
		}
	}
	// cerr<<1<<endl;
	for(auto p:ev){
		x=p.first,y=p.second;
		if(dep[x]>dep[y]) swap(x,y);
		if(dep[x]<dep[y]) dn[x].insert(y),up[y].insert(x);
	}
	// for(i=1;i<=n;i++) cerr<<dep[i]<<' ';cerr<<endl;
	for(i=1;i<=n;i++){
		tot++;
		for(int x:dn[i]) add(x,tot,b);
		for(int x:up[i]) add(tot,x,0);
		tot++;
		for(int x:dn[i]) add(tot,x,0);
		for(int x:up[i]) add(x,tot,b);
	}
	for(i=1;i<=n;i++){
		for(int x:up[i]) for(int y:up[i]) if(!st.count({x,y})) add(x,y,b),add(y,x,b);
		for(int x:dn[i]) for(int y:dn[i]) if(!st.count({x,y})) add(x,y,b),add(y,x,b);
	}
	// cerr<<1<<endl;
	dij();
	for(i=2;i<=n;i++) cout<<dis[i]<<'\n';
	return 0;
}